iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0

Update(09/28): 已完成 section 4,5

晚上剛回台北QQ
這個筆記還蠻個人的,對別人來說沒太大參考價值
先看到 Section 3,明天先補上 4 5
照原定計畫看把 MySQL Basics 看過去,
雖然本來就會一些,但還是有收穫。

本篇包含 5 sections:

  1. Querying data
  2. Sorting data
  3. Filtering data
  4. Joining tables
  5. Grouping data

evalute order

https://ithelp.ithome.com.tw/upload/images/20210927/20131394aXhrM0C9Rc.png

1. Quering data

select

  • 不一定要接 FROM clause
    select now()
    select 1+1
  • The dual table (dummy)

具體什麼時候會用到呢

2. Sorting data

order by

  • 可以依照多個 column 排,要升降冪可以分別 specify
    order by col1 desc, col2 asc
  • 配合 field function,可以指定一個 list,並讓結果照著此 list 的順序排
    field(要找的string, str1, str2, str3...): 例如 field('a', 'a', 'b') 回 1,field('b', 'a', 'b') 回 2
SELECT 
    orderNumber, status
FROM
    orders
ORDER BY FIELD(status,
        'In Process',
        'On Hold',
        'Cancelled',
        'Resolved',
        'Disputed',
        'Shipped');
  • null < non-null
    asc 時會出現在最前面

3. Filtering data

where

  • 過濾用,配合 and or, like, in, between, comparison operators(<>=) 等使用

select distinct

  • 去除重複的 rows

and、or、in、not in

  • mysql 中 null 不是 0
  • 注意 與 null 的比較

為什麼要能夠與 null 比較?背後的語意是什麼?

between

  • 日期比較時要 cast
SELECT 
   orderNumber,
   requiredDate,
   status
FROM 
   orders
WHERE 
   requireddate BETWEEN 
     CAST('2003-01-01' AS DATE) AND 
     CAST('2003-01-31' AS DATE);

like

  • %0或多,_1
  • ESCAPE clause 來指定逃脫字元
選 含有 _20 的 records
SELECT 
    productCode, 
    productName
FROM
    products
WHERE
    productCode LIKE '%$_20%' ESCAPE '$';

limit: 限制返回的結果數

  • LIMIT [offset,] row_count; offset 由 0 開始,包含。
  • 找到前n大 / 前n小 / 第n大 的結果(配合 ORDER BY)
  • pagination

IS NULL

  • 有一些特別的 features:
  1. If a DATE or DATETIME column has a NOT NULL constraint and contains a special date '0000-00-00', you can use the IS NULL operator to find such rows.
  2. Influence of @@sql_auto_is_null variable

4. Joining tables

從不同表拿 Column,通常兩張表之間有 foreign keys 關聯

table / column alias

table aliases: from table as t

  • 當使用 join 時,如果兩張表有相同的 column,就需要 table alias 然後指定 t1.column 和 t2.column,否則會有 ambiguous error

column aliases: select column as c from table

  • where clause 不能用 column aliases
    依據前面提到的 evaluation order 可以知道 where 比 select 早執行。

inner join

  • 交集
  • on t1.column = t2.column 相等於 using (column),括號不能省略

不懂括號的意義?

left / right join

  • 一定有左 / 右表所有的 records,如果在右 / 左表找不到 on 條件的 record 則填 Null
  • 注意 WHERE clause 和 ON clause
    例如
    WHERE ordernum=123
    where 是 join 完的結果再過濾留下 ordernum = 123 的結果
    FROM orders o LEFT JOIN orderDetails d ON o.ordernum = d.ordernum and o.ordernum=123
    on 則是在 join 時,如果發現 o.ordernum不是123,就不做 leftjoin,也就是右表的欄位會被填上 NULL

cross join

  • Cartesian product
  • 沒有 on 或 using clause

實際應用還不是很有感覺

self join

  • join 同張表時,要注意 join condition 要有 c1.column > c2.column 之類的東西,以除去順序不同但一樣的 record。

5. Grouping data

group by

https://ithelp.ithome.com.tw/upload/images/20210928/20131394mMZPXg45mh.png

  • 把很多 records 合併成一條
  • 通常與 aggregate functions 使用
    aggregate functions 就是從一堆 rows 算出一個值
  • 群組排序:GROUP BY cloumn DESC/ASC

having

https://ithelp.ithome.com.tw/upload/images/20210928/20131394tCuyPuy4LR.png

  • having 是過濾群組,where則是對個別records(緊接在table之後)

having 或是 where 可以達到類似的效果的時候,用哪個比較快呢?

rollup

  • 除了得到每個分組的結果(subtotals),還想要的總和的時候(grand totals)
SELECT 
    select_list
FROM 
    table_name
GROUP BY
    c1, c2, c3 WITH ROLLUP;
  • group by 多個 column 並 rollup 時,hierarchy 是 c1 > c2
    例如 group by c1, c2 with rollup grouping sets如下
    (c1, c2) :這些subgroups(下圖無框部分)
    (c1) :對於c1的加總(下圖紅框)
    () 只會有一個就是全部的總和(下圖橘框)

https://ithelp.ithome.com.tw/upload/images/20210928/201313945GpXnRHDhV.png

  • grouping() function
    如果總和沒有欄位表示,就會顯示 null
    透過 if() + grouping() 可以把 null 值換成有意義的名字

先知道,以後有需要再細讀

SELECT 
    IF(GROUPING(orderYear),
        'All Years',
        orderYear) orderYear,
    IF(GROUPING(productLine),
        'All Product Lines',
        productLine) productLine,
    SUM(orderValue) totalOrderValue
FROM
    sales
GROUP BY 
    orderYear , 
    productline 
WITH ROLLUP;

上一篇
【Day 11】分散式系統小總結
下一篇
【Day 13】MySQL Basics II
系列文
什麼都不會還敢說你是 RD 啊?畢業後的後端入職前準備31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言